home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_11_12 / engbert / bits.c < prev    next >
Text File  |  1993-05-11  |  2KB  |  98 lines

  1. /*                          BITS.C
  2. **
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <conio.h>
  8. #include <ctype.h>
  9. #include "config.h"
  10. #include "proto.h"  /* prototypes and #defines */
  11.  
  12.  
  13. static unsigned char bit_mask = 0;
  14. static unsigned bit_buffer;
  15. #define BIT_COUNT 8
  16.  
  17.  
  18. #ifdef COMPRESS
  19.  
  20. write_byte (unsigned char c) {
  21. char i;
  22.             for (i= 0; i< BIT_COUNT; i++) {
  23.                 write_bit( c > 127 );
  24.                 c = c << 1;
  25.             }
  26. }
  27.  
  28.  
  29. /****** write_bit(): write bit to file **********/
  30.  
  31. extern unsigned int output_fsize;
  32.  
  33. flush_bits() {
  34. char i;
  35.     if (!bit_mask)  write_bit(0);
  36.     /* send off pending full byte */
  37.     else;
  38.     for (i=0; i<BIT_COUNT; i++) write_bit(0);
  39.     /* transmit pending partial byte*/
  40. }
  41.  
  42. void write_bit (unsigned char bit) {
  43.     if (!bit_mask) {
  44.         putc(bit_buffer,stdout);
  45.         bit_mask = 0x80;
  46.         bit_buffer = 0;
  47.         output_fsize++;
  48.     } else;
  49.     if (bit) bit_buffer |= bit_mask;
  50.     else;
  51.     bit_mask >>= 1;
  52. } /*write_bit */
  53.  
  54. #else COMPRESS
  55.  
  56. signed int read_byte (signed int bit) {
  57. signed int byte;
  58. unsigned char i;
  59. int c;
  60.     byte = bit; /* the first bit of ASCII literal */
  61.      /*pick up the remaining 7 bits */
  62.     for (i=1; i<BIT_COUNT; i++)    {
  63.         c = read_bit();
  64.         byte = byte << 1;
  65.         byte = byte | c;
  66.     }
  67. return byte;
  68. }
  69.  
  70.  
  71. /******** read_bit():  read bit from file *********/
  72.  
  73. static int ch = 0;
  74. int read_bit () {
  75.     bit_mask >>= 1 ;
  76.     if (!bit_mask) {
  77.         ch = getc(stdin);
  78.         if (ch == EOF) return EOF;
  79.         else bit_mask = 0x80;
  80.     }
  81.     return ( (ch & bit_mask) > 0);
  82. }
  83.  
  84.  
  85. #endif COMPRESS
  86.  
  87. /************** init_bits() ********************/
  88.  
  89. init_bits() {
  90. #ifdef COMPRESS
  91.     bit_mask = 0x80;  /* binary 1000 0000*/
  92. #else
  93.     bit_mask = 0;
  94.     ch = 0;  /* getc returns signed int */
  95. #endif
  96.     bit_buffer = 0;
  97. }
  98.